package com.yzg.simple.netty.protobuf.server;

import com.yzg.simple.netty.protobuf.MessageInfos;
import io.netty.buffer.Unpooled;
import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.SimpleChannelInboundHandler;
import io.netty.util.CharsetUtil;

/**
 * @author misterWei
 * @create 2019年12月26号:23点02分
 * @mailbox mynameisweiyan@gmail.com
 *
 * 对服务器Handler 进行处理做业务操作
 *
 * 总体来说相当于 事件驱动,那个事件产生了,就会调用对应的方法 入栈InBound 出栈outBound
 */
public class ServerHandler extends SimpleChannelInboundHandler<MessageInfos.MessageType>{

    /*//这个方法用来读取客户端发送的数据
    @Override
    public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {
        //1.自定义异步任务队列 taskQueue
        // 特别注意,这是队列,虽然是异步,但是还是同一个线程去执行该队列,还是需要排队的
        ctx.channel().eventLoop().execute(()->{
            //写到缓存区并刷新到通道
            try {
                Thread.sleep(5 * 1000);
                ctx.writeAndFlush(Unpooled.copiedBuffer("hello 客户端 2(*^_^*)",CharsetUtil.UTF_8));
            }catch (Exception ex){
                ex.printStackTrace();
            }

        });

        ctx.channel().eventLoop().execute(()->{
            //写到缓存区并刷新到通道
            try {
                Thread.sleep(10 * 1000);
                ctx.writeAndFlush(Unpooled.copiedBuffer("hello 客户端 3(*^_^*)",CharsetUtil.UTF_8));
            }catch (Exception ex){
                ex.printStackTrace();
            }

        });

        //2,自定义定时任务队列 scheduledTaskQueue
        ctx.channel().eventLoop().schedule(new Runnable() {
            @Override
            public void run() {
                ctx.writeAndFlush(Unpooled.copiedBuffer("hello 客户端 4(*^_^*)",CharsetUtil.UTF_8));

            }
        }, 5L, TimeUnit.MICROSECONDS);

        System.out.println("ok");

        //ByteBuf 和NIO 的ByteBuffer 是完全不一样的
        *//*ByteBuf byteBuf = (ByteBuf) msg;
        System.out.println("客户端消息为:\r"+byteBuf.toString(CharsetUtil.UTF_8));
        System.out.println("客户端地址为:\r"+ctx.channel().remoteAddress());*//*
    }*/

   //这个方法用来对客服端进行回复
    @Override
    public void channelReadComplete(ChannelHandlerContext ctx) throws Exception {
        //写到缓存区并刷新到通道
        ctx.writeAndFlush(Unpooled.copiedBuffer("hello 客户端 1(*^_^*)",CharsetUtil.UTF_8));
    }

    @Override
    public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception {
        //异常处理一般都是关闭当前管道
        ctx.close();
    }

    @Override
    protected void channelRead0(ChannelHandlerContext ctx, MessageInfos.MessageType msg) throws Exception {
        if (msg.getDataType() == MessageInfos.MessageType.DataType.UserType) {
            MessageInfos.User user = msg.getUser();
            System.out.println("用户Id = " + user.getId() + " 用户姓名 = " + user.getName());

        }else{
            MessageInfos.Company company = msg.getCompany();

            System.out.println("是否倒闭 = " + company.getFlag() +" 企业名称 = " + company.getComName());

    }
    }
}
